package com.sweet.cookie;

import com.sweet.enums.Charset;
import com.sweet.lang.StringUtil;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;

/**
 * Cookie工具
 * 
 * <pre>
 * 同一台tomcat服务器上，虽然项目域名不同，但容器统一，所以暂时使用path作为cookie共享。
 * 使用path为/，说明应用的cookie取自/下，所以可以实现跨应用共享cookie
 * 使用domain，设置为".uqee.com"，则可以实现uqee.com域名下实现共享，即子域名和主域名共享cookie
 * </pre>
 * 
 * @author limi 2015-09-06
 */
public final class CookieUtil {
	// 保存cookie范围，默认存期为一天
	// private static final int AGE = 24 * 60 * 60;

	// 以下两个常量在调用该jar包时自定义
	// static final String domain = ".uqee.com";// 对于二级域名共享cookie使用
	// static final String path = "/";// 对于同一webApps目录下的多个应用项目使用

	private static final String CHARSET = Charset.UTF8.getCharset();

	private CookieUtil() {
	}

	/**
	 * 第一种设置path，用于同一webapps下的多个应用共享
	 * 
	 * @param response
	 * @param key
	 * @param value
	 * @param maxAge
	 * @param path
	 * @throws UnsupportedEncodingException
	 */
	public static void createCookieByPath(HttpServletResponse response, String key, String value, int maxAge,
			String path) throws UnsupportedEncodingException {
		createCookie(response, key, value, maxAge, null, path, true);
	}

	/**
	 * 第二种设置domain，用于跨域名访问
	 * 
	 * @param response
	 * @param key
	 * @param value
	 * @param maxAge
	 * @param domain
	 * @throws UnsupportedEncodingException
	 */
	public static void createCookieByDomain(HttpServletResponse response, String key, String value, int maxAge,
			String domain) throws UnsupportedEncodingException {
		createCookie(response, key, value, maxAge, domain, null, false);
	}

	/**
	 * 保存cookie
	 * 
	 * @param response
	 * @param key
	 * @param value
	 * @param maxAge
	 * @param domain
	 * @param path
	 * @param isSavePath
	 */
	private static void createCookie(HttpServletResponse response, String key, String value, int maxAge, String domain,
			String path, boolean isSavePath) throws UnsupportedEncodingException {
		// System.out.println("保存cookie：key=" + key + ",value=" + value +
		// ",isSavePath=" + isSavePath);

		// 为了防止cookie创建失败，发生java.lang.IllegalArgumentException: Control
		// character in cookie value, consider BASE64 encoding your
		// value错误，则必须在添加时就编码为UTF-8，然后再读取时解码即可
		Cookie cookie = new Cookie(key, URLEncoder.encode(value, CHARSET));
		if (isSavePath) {
			cookie.setPath(path);
		} else {
			cookie.setDomain(domain);
		}

		cookie.setMaxAge(maxAge);
		response.addCookie(cookie);
	}

	// 根据path获取统一容器下所有应用共享cookie
	public static String getCookie(HttpServletRequest request, String key) throws UnsupportedEncodingException {
		Cookie[] cookies = request.getCookies();
		if (cookies != null) {
			for (Cookie cookie : cookies) {
				if (StringUtil.equalsIgnoreCase(cookie.getName(), key)) {
					// 取出解码数据,如果是null或者空字符串，则返回null
					String value = null;
					if (StringUtil.isNotBlank(cookie.getValue())) {
						value = URLDecoder.decode(cookie.getValue(), CHARSET);
					}

					// System.out.println("获取cookie：key=" + key + ",value=" +
					// value);
					return value;
				}
			}
		}
		// 必须返回null
		return null;
	}

	// 根据path删除同一容器下所有应用共享cookie
	public static void removeCookieByPath(HttpServletRequest request, HttpServletResponse response, String key,
			String path) throws UnsupportedEncodingException {
		// 重新创建一个和销毁前一样path，周期为0,值为空“”的cookie，直接可以销毁
		createCookieByPath(response, key, "", 0, path);
	}

	// 根据dmaon删除跨域名共享cookie
	public static void removeCookieByDomain(HttpServletRequest request, HttpServletResponse response, String key,
			String domain) throws UnsupportedEncodingException {
		// 重新创建一个和销毁前一样domain，周期为0,值为空“”的cookie，直接可以销毁
		createCookieByDomain(response, key, "", 0, domain);
	}
}
